﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SQLite;
using System.Data;
using MMO_MANAGER.Utils;
// sử dụng 3 file dll: ...SQLite, ...Linq, ...Interop
namespace MMO_MANAGER.DAO
{
    class AccessData
    {

        public static void GetPassDB()
        {
            string pass = "oWPweOjms9G41HuPQV8NibEdhRyuZGM45s10snhpzgQ=";
            string chuoi = "mahoa";
            connectString = "Data Source=mmo.db;Password=" + EasyEncoding.Descrypt(pass, chuoi);
        }
        //public static string passdb="";
        //public static string DBString { get; set; }
        public static string connectString { get; set; }

        //public static string connectString = DBString;
        private SQLiteCommand cmd;
        private SQLiteConnection conn;
        private SQLiteDataAdapter da;

        /// <summary>
        ///     kết nối tới CSDL - cơ sở dữ liệu SQL server
        /// </summary>
        public void Connect()
        {
            if (conn == null)
            {
                // nếu không tồn tại thì khởi tạo 1 kết nối tới csdl
                //conn = new SQLiteConnection(connectString);
                conn = new SQLiteConnection(connectString);
            }

            if (conn.State == ConnectionState.Closed)
            {
                // nếu trạng thái kết nối là đóng thì mở kết nối
                conn.Open();
            }
        }

        /// <summary>
        ///     đóng kết nối tới CSDL
        /// </summary>
        public void Disconnect()
        {
            if (conn != null && conn.State == ConnectionState.Open)
            {
                // kiểm tra kết nối có tồn tại hay k?
                // nếu tồn tại thì tiếp tục kiểm tra trạng thái kết nối là open hay k?
                // nếu có thì đóng kết nối
                conn.Close();
            }
        }

        /// <summary>
        ///     lấy dữ liệu từ CSDL thông qua câu lênh truy vấn
        /// </summary>
        /// <param name="sql">câu truy vấn</param>
        /// <returns>dataset dữ liệu trả về</returns>
        public DataSet GetDataSet(string sql)
        {
            //khởi tạo dataset
            var ds = new DataSet();
            //mở kết nối
            Connect();

            //tạo cầu nối tới csdl, thông qua câu truy vấn
            da = new SQLiteDataAdapter(sql, conn);
            //đổ dữ liệu vào dataset
            da.Fill(ds);
            //đóng kết nối
            Disconnect();

            //trả về dataset
            return ds;
        }

        /// <summary>
        ///     lấy dữ liệu từ CSDL thông qua câu lênh truy vấn
        /// </summary>
        /// <param name="sql">câu truy vấn</param>
        /// <param name="parames">Mảng các giá trị</param>
        /// <param name="IsSPduct">True : sử dụng store product, False : là dùng câu truy vấn</param>
        /// <returns>dataset dữ liệu trả về</returns>
        public DataSet GetDataSet(string sql, SQLiteParameter[] parames, bool IsSPduct)
        {
            //khởi tạo dataset
            var ds = new DataSet();
            //mở kết nối
            Connect();

            //tạo kết nối tới csdl, thông qua câu truy vấn
            cmd = new SQLiteCommand(sql, conn);

            // kiểm tra có phải là StoredProcedure hay k ? 
            if (IsSPduct)
            {
                cmd.CommandType = CommandType.StoredProcedure;
            }

            // truyền thêm giá trị 
            cmd.Parameters.AddRange(parames);

            da = new SQLiteDataAdapter(cmd);

            //đổ dữ liệu vào dataset
            da.Fill(ds);

            //đóng kết nối
            Disconnect();

            //trả về dataset
            return ds;
        }

        /// <summary>
        ///     Thực thi các lệnh thêm - xóa - sửa
        /// </summary>
        /// <param name="sql">câu truy vấn</param>
        public void ExecuteNoneQuery(string sql)
        {
            //mở kết nối
            Connect();
            //khởi tạo lớp command
            cmd = new SQLiteCommand(sql, conn);
            //thực thi câu lệnh sql - insert | update | delete
            cmd.ExecuteNonQuery();
            //đóng kết nối
            Disconnect();
        }

        /// <summary>
        ///     Thực thi các lệnh thêm - xóa - sửa dùng thêm tham số
        /// </summary>
        /// <param name="sql">câu truy vấn</param>
        /// <param name="parames">Mảng các giá trị</param>
        public void ExecuteNoneQuery(string sql, SQLiteParameter[] parames)
        {
            //mở kết nối
            Connect();
            //khởi tạo lớp command
            cmd = new SQLiteCommand(sql, conn);
            // truyền thêm giá trị 
            cmd.Parameters.AddRange(parames);
            //thực thi câu lệnh sql - insert | update | delete
            cmd.ExecuteNonQuery();
            //đóng kết nối
            Disconnect();
        }

        /// <summary>
        ///     Thực thi các lệnh thêm - xóa - sửa dùng thêm tham số dung store produce
        /// </summary>
        /// <param name="sql">câu truy vấn</param>
        /// <param name="parames">Mảng các giá trị</param>
        public void ExecuteNoneQuery(string sql, SQLiteParameter[] parames, bool IsSPduct)
        {
            //mở kết nối
            Connect();
            //khởi tạo lớp command
            cmd = new SQLiteCommand(sql, conn);

            // kiểm tra có phải là StoredProcedure hay k ? 
            if (IsSPduct)
            {
                cmd.CommandType = CommandType.StoredProcedure;
            }

            // truyền thêm giá trị 
            cmd.Parameters.AddRange(parames);
            //thực thi câu lệnh sql - insert | update | delete
            cmd.ExecuteNonQuery();
            //đóng kết nối
            Disconnect();
        }

        /// <summary>
        ///     Hàm Reader
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="parames"></param>
        /// <returns></returns>
        public SQLiteDataReader ExecuteReader(string sql, SQLiteParameter[] parames)
        {
            //mở kết nối
            Connect();
            //khởi tạo lớp command
            cmd = new SQLiteCommand(sql, conn);
            // truyền thêm giá trị 
            cmd.Parameters.AddRange(parames);
            try
            {
                return cmd.ExecuteReader();
            }
            catch (SQLiteException)
            {
                return null;
            }
        }
    }
}
